package text

import (
	"fmt"
	
	"inkjet168x-sdk-go/sdk/protocol/common"
)

// Builder 文本协议构建器 - 建造者模式
type Builder struct {
	protocol *Protocol
}

// NewBuilder 创建文本协议构建器
func NewBuilder() *Builder {
	return &Builder{
		protocol: NewProtocol().(*Protocol),
	}
}

// NewBuilderInterface 创建文本协议构建器（返回接口类型）
func NewBuilderInterface() common.ProtocolBuilder {
	return NewBuilder()
}

// SetFontName 设置字体名称
func (tb *Builder) SetFontName(fontName string) *Builder {
	tb.protocol.SetFontName(fontName)
	return tb
}

// SetFontSize 设置字号
func (tb *Builder) SetFontSize(fontSize uint32) *Builder {
	tb.protocol.FontSize = fontSize
	return tb
}

// SetFontWidth 设置字宽
func (tb *Builder) SetFontWidth(fontWidth uint32) *Builder {
	tb.protocol.FontWidth = fontWidth
	return tb
}

// SetCharSpacing 设置字间隔
func (tb *Builder) SetCharSpacing(charSpacing uint32) *Builder {
	tb.protocol.CharSpacing = charSpacing
	return tb
}

// SetRotation 设置旋转角度
func (tb *Builder) SetRotation(rotation uint32) *Builder {
	tb.protocol.Rotation = rotation
	return tb
}

// SetBold 设置加粗
func (tb *Builder) SetBold(bold bool) *Builder {
	tb.protocol.SetBold(bold)
	return tb
}

// SetItalic 设置斜体
func (tb *Builder) SetItalic(italic bool) *Builder {
	tb.protocol.SetItalic(italic)
	return tb
}

// SetStyle 设置样式
func (tb *Builder) SetStyle(style common.Style) *Builder {
	tb.protocol.Style = uint32(style)
	return tb
}

// SetPosition 设置位置
func (tb *Builder) SetPosition(x, y uint32) *Builder {
	tb.protocol.SetPosition(x, y)
	return tb
}

// SetText 设置文本内容
func (tb *Builder) SetText(text string) *Builder {
	tb.protocol.SetText(text)
	return tb
}

// SetSequence 设置序列号
func (tb *Builder) SetSequence(sequence uint16) *Builder {
	tb.protocol.Sequence = sequence
	return tb
}

// Build 构建协议实例
func (tb *Builder) Build() (common.Protocol, error) {
	// 验证参数
	if err := tb.protocol.Validate(); err != nil {
		return nil, fmt.Errorf("文本协议参数验证失败: %w", err)
	}
	
	// 返回协议实例的副本
	result := *tb.protocol
	return &result, nil
}

// Reset 重置构建器
func (tb *Builder) Reset() common.ProtocolBuilder {
	tb.protocol = NewProtocol().(*Protocol)
	return tb
}

// 便捷方法

// AsTitle 设置为标题样式
func (tb *Builder) AsTitle() *Builder {
	return tb.SetFontSize(32).SetBold(true).SetStyle(common.StyleSolid)
}

// AsSubtitle 设置为副标题样式
func (tb *Builder) AsSubtitle() *Builder {
	return tb.SetFontSize(24).SetBold(true).SetFontWidth(24).SetStyle(common.StyleSolid)
}

// AsBody 设置为正文样式
func (tb *Builder) AsBody() *Builder {
	return tb.SetFontSize(16).SetBold(false).SetStyle(common.StyleSolid)
}

// AsCaption 设置为说明文字样式
func (tb *Builder) AsCaption() *Builder {
	return tb.SetFontSize(12).SetBold(false).SetItalic(true).SetStyle(common.StyleSolid)
}

// AsDotMatrix 设置为点阵样式
func (tb *Builder) AsDotMatrix() *Builder {
	return tb.SetStyle(common.StyleDotMatrix)
}

// AsRotated 设置为旋转文本
func (tb *Builder) AsRotated(angle uint32) *Builder {
	return tb.SetRotation(angle)
}